import java.math.BigInteger;


public class TestLibro implements Test{

	
	String nombre = "Gustavo";
	String apellido = "Ferreyra";
	String direccion="500 Millas 296" ;
	String ciudad= "Rafaela";
	int codigoPostal=2300 ;
	int mes= 10 ;
	int dia= 22;
	int anio= 1991;
	int anioPublicacion = 2008;
	int dni= 35953949;
	int telefono= 451375;
	Usuario usuario = new Usuario(dni,nombre, apellido, dia, mes, anio, direccion, codigoPostal, ciudad, telefono);
	
	BigInteger isbn = new BigInteger("9783161484100");
	Editorial editorial = new Editorial(01,"Ivrea");
	Tipo tipo = new Tipo(01, "Ciencia Ficcion");
	
	// Se crea un objeto Libro
	Libro libro = new Libro(isbn,"El Señor de los Anillos",anioPublicacion,editorial,tipo);
	
	// Main
	public static void main(String[] args) {
		TestLibro test = new TestLibro();
		test.ejecutar();
	}
	
	
	public void ejecutar(){
		boolean resultado = true; 
		System.out.println("TEST DE LA CLASE LIBRO");
		
		// Comprobamos el atributo Codigo
		System.out.print("\t ISBN: \t");
		if(!this.comprobarIsbn()){
			resultado=false;
			System.out.println("FALLO");
		}
		else
		{
			System.out.println("OK");
		}
		
		System.out.print("\t Editorial: \t");
		if(!this.comprobarEditorial()){
			resultado=false;
			System.out.println("FALLO");
		}
		else
		{
			System.out.println("OK");
		}
		
		System.out.print("\t Anio Publicacion: \t");
		if(!this.comprobarAnioPublicacion()){
			resultado=false;
			System.out.println("FALLO");
		}
		else
		{
			System.out.println("OK");
		}
		
		System.out.print("\t Tipo: \t");
		if(!this.comprobarTipo()){
			resultado=false;
			System.out.println("FALLO");
		}
		else
		{
			System.out.println("OK");
		}
		
		
		System.out.print("\t Baja: \t");
		if(!this.comprobarBaja()){
			resultado=false;
			System.out.println("FALLO");
		}
		else
		{
			System.out.println("OK");
		}
		
		System.out.print("\t Alta \t");
		if(!this.comprobarAlta()){
			resultado=false;
			System.out.println("FALLO");
		}
		else
		{
			System.out.println("OK");
		}
		
		
		System.out.print("\t Realizar Prestamo: \t");
		if(!this.comprobarRealizarPresta()){
			resultado=false;
			System.out.println("FALLO");
		}
		else
		{
			System.out.println("OK");
		}
		
		System.out.print("\t Disponibilidad: \t");
		if(!this.comprobarDisponibilidad()){
			resultado=false;
			System.out.println("FALLO");
		}
		else
		{
			System.out.println("OK");
		}
		
		// Mostrar Datos
		System.out.println("Datos del libro:\t");
		this.comprobarMostrarDatos();
		
		// Veredicto
		if(resultado){
			System.out.println("La clase funciona correctamente");
		}
		else
		{
			System.out.println("Existen Errores en la Clase");
		};
	}

	// Para utilizar en la clase Tests
	public boolean ejecutarSilencioso(){
		boolean resultado = true;

		// Comprobamos los atributos correspondientes
		if(!this.comprobarIsbn()){resultado=false;System.out.println("Libro: Existen Errores en comprobarIsbn");};
		if(!this.comprobarAnioPublicacion()){resultado=false;System.out.println("Libro: Existen Errores en comprobarAnioPublicacion");};
		if(!this.comprobarEditorial()){resultado=false;System.out.println("Libro: Existen Errores en comprobarEditorial");};
		if(!this.comprobarTipo()){resultado=false;System.out.println("Libro: Existen Errores en comprobarTipo");};
		if(!this.comprobarBaja()){resultado=false;System.out.println("Libro: Existen Errores en comprobarBaja");};
		if(!this.comprobarAlta()){resultado=false;System.out.println("Libro: Existen Errores en comprobarAlta");};
		if(!this.comprobarRealizarPresta()){resultado=false;System.out.println("Libro: Existen Errores en comprobarRealizarPresta");};
		if(!this.comprobarDisponibilidad()){resultado=false;System.out.println("Libro: Existen Errores en comprobarDisponibilidad");};
		return resultado;
	}
	
	
	// Métodos de prueba de cada atributo
	public boolean comprobarIsbn(){
		if(this.getIsbn().compareTo(this.getLibro().getIsbn())==0){
			return true;
		}
		else
		{
			return false;
		}
	}
	
	public boolean comprobarAnioPublicacion() {
		if(this.getAnioPublicacion() == this.getLibro().getAnioPublicacion()){
			return true;
		}
		else
		{
				return false;}
	}
	
	public boolean comprobarTipo() {
		if(this.getTipo().equals(this.getLibro().getTipo())){
			return true;
		}
		else
		{
		return false;}
	}
	public boolean comprobarEditorial() {
		if(this.getEditorial().equals(this.getLibro().getEditorial())){
			return true;
		}
		else
		{
		return false;}
	}
	
	public void comprobarMostrarDatos(){
		this.getLibro().imprimirDatos();
	}
	
	public boolean comprobarBaja(){
		this.getLibro().deshabilitar();
		if (!this.getLibro().estaHabilitado()) {
			return true;
		}else {
			return false;
		}
	}
	
	
	public boolean comprobarAlta(){
		this.getLibro().habilitar();
		if (this.getLibro().estaHabilitado()) {
			return true;
		}else {
			return false;
		}
	}
	
	
	
	public boolean comprobarRealizarPresta(){
		libro.cancelarPrestamo();
		Prestamo presta = this.getLibro().realizarPrestamo(this.getUsuario());
		for (Prestamo elemento : this.getLibro().obtenerCopiaDePrestamos()) {
			if (elemento.equals(presta)) {
				return true;
			}
		}
		return false;}
	
	public boolean comprobarDisponibilidad(){
		boolean resultado=true;

		if(this.getLibro().disponiblePrestamos()){
			resultado=false;
		}
		
		this.getLibro().cancelarPrestamo();
		
		if(!this.getLibro().disponiblePrestamos()){
			resultado=false;
		}
		
		return resultado;
	}
	
	// Getters And Setters
	public BigInteger getIsbn() {
		return isbn;
	}

	public void setIsbn(BigInteger isbn) {
		this.isbn = isbn;
	}

	public Editorial getEditorial() {
		return editorial;
	}

	public void setEditorial(Editorial editorial) {
		this.editorial = editorial;
	}

	public Tipo getTipo() {
		return tipo;
	}

	public void setTipo(Tipo tipo) {
		this.tipo = tipo;
	}

	public int getAnioPublicacion() {
		return anioPublicacion;
	}

	public void setAnioPublicacion(int anioPublicacion) {
		this.anioPublicacion = anioPublicacion;
	}

	public Libro getLibro() {
		return libro;
	}

	public void setLibro(Libro libro) {
		this.libro = libro;
	}


	@Override
	public String getClase() {
		
		return this.getLibro().getClass().getName();
	}


	private Usuario getUsuario() {
		return usuario;
	}


	private void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

}
